#ifndef __TCPSERVER_HPP__
#define __TCPSERVER_HPP__

#include "EventLoop.hpp"
#include "Acceptor.hpp"
#include "TcpConnection.hpp"

namespace xww
{
    class TcpServer
    {
    public:
        TcpServer(unsigned short port, const string &ip = "0.0.0.0")
            : _acceptor(port, ip) // 初始化Acceptor对象
              ,
              _loop(_acceptor)
        {
        }

        ~TcpServer()
        {
            // 析构函数中不需要做任何操作，因为Acceptor和EventLoop的析构函数会自动释放资源
        }

        //为什么这样设置？
        //因为TcpServer需要设置三个回调函数来处理连接、消息和关闭事件
        //这些回调函数可以是lambda表达式或函数指针
        //使用std::move可以将这些回调函数从临时对象转移到
        //EventLoop对象中，从而避免不必要的拷贝
        void setAllCallbacks(TcpConnectionCallback &&cb1,
                             TcpConnectionCallback &&cb2,
                             TcpConnectionCallback &&cb3)
        {
            _loop.EsetAllCallbacks(std::move(cb1), std::move(cb2), std::move(cb3));
        }

        void start()
        {
            _acceptor.ready(); // 准备监听
            // _loop.EsetAllCallbacks(
            //     std::bind(&TcpConnection::handleConnectionCallback, std::placeholders::_1),
            //     std::bind(&TcpConnection::handleMessageCallback, std::placeholders::_1),
            //     std::bind(&TcpConnection::handleCloseCallback, std::placeholders::_1)
            // );
            _loop.loop(); // 启动事件循环
        }

        void stop()
        {
            _loop.unloop(); // 停止事件循环
        }

    private:
        Acceptor _acceptor; // 接受器对象
        EventLoop _loop;    // 事件循环对象
    };

} // end of namespace xww

#endif